package appvideo;

import appvideo.logica.Alquiler;
import appvideo.logica.Pelicula;
import appvideo.logica.Producto;
import appvideo.logica.ProductoAlquilado;
import appvideo.logica.Promociones;
import appvideo.logica.PromocionesDiasSemana;
import appvideo.logica.PromocionesGenero;
import appvideo.logica.PromocionesMasPorMenos;
import appvideo.logica.PromocionesPuntos;
import appvideo.logica.Socio;
import appvideo.logica.Tarjeta;
import appvideo.logica.Videojuego;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.management.timer.Timer;


public class SubMenu_Cajero {
    
    public static void visualizaPeliculas(){
        Pelicula p = new Pelicula();
        SubMenu_operacionesProductos.visualizarProductos(p);
    }
    
    public static void visualizaVideojuegos(){
        Videojuego v = new Videojuego();
        SubMenu_operacionesProductos.visualizarProductos(v);
    }
    
    public static void buscaPelicula(){
        Producto p = new Pelicula();
        SubMenu_operacionesProductos.buscarProductos(p);
       
    }
    
    public static void buscaVideojuego(){
        Producto v = new Videojuego();
        SubMenu_operacionesProductos.buscarProductos(v);
       
    }
    
    public static void gestionAlquiler(){
        Alquiler alquiler;
        Socio s = (Socio)main.usuarioActual;
        int opc_selec_alq=0;
        do{
            opc_selec_alq = ObtenerTeclado.dameEntero("\nSeleccione opcion:\n1.Nuevo Alquiler\n2.Devolucion Pelicula\n3.Visualiza mi alquiler"
                        + "\n4.Anula Alquiler\n5.Volver atras\n6.Salir");
        
            switch(opc_selec_alq){
                case 1: //NUEVO ALQUILER
                    int codigoProducto=0;
                    int tipoProducto;//Pelicula o Videojuego
                    alquiler=null;
                    List<ProductoAlquilado> lpa= new ArrayList<ProductoAlquilado>();
                    List<Producto> lp = null;
                    int selector=0;
                    
                    if(Alquiler.buscaAlquiler(s.getDni())==null){
                        do{
                            tipoProducto=ObtenerTeclado.dameEntero("\nSeleccione opcion:\n1.Añadir Pelicula\n2.Añadir Videojuego\n5.Confirmar Alquiler\n0.Cancelar Alquiler\n");
                            if(tipoProducto==0){ //CANCELAR ALQUILER(hacerlo en curso)
                                codigoProducto=-1;
                                opc_selec_alq=0;
                            }else if(tipoProducto==1 || tipoProducto==2){
                                if(tipoProducto==1){
                                    Producto p = new Pelicula();
                                    System.out.println("Peliculas disponibles para alquiler:");
                                    //if(selector==0){
                                        lp = p.visualizarProductos();
                                    //     selector=1;
                                    // }
                                    for(Producto p2 : lp){
                                        System.out.println(((Pelicula)p2).toString());
                                    }
                                }else if(tipoProducto==2){
                                    Producto p = new Videojuego();
                                    System.out.println("Videojuegos disponibles para alquiler:");
                                    //if(selector==0){
                                        lp = p.visualizarProductos();
                                    //    selector=1;
                                    //}
                                    for(Producto p2 : lp){
                                        System.out.println(((Videojuego)p2).toString());
                                    }
                                }
                                //BUCLE QUE DEVUELVE PRODUCTOS POR SU CODIGO HASTA QUE SE INTRODUZCA UN CERO
                                if(codigoProducto>=0){ //Si es -1 no entra aqui
                                    codigoProducto=ObtenerTeclado.dameEntero("\nInserte codigo producto a buscar:");

                                    //1º Crear producto desde base de datos con el codigo dado
                                    //2º Crear producto alquilado a partir del producto
                                    //3º Crear lista de productos alquilados
                                    //4º Crear Socio para el Alquiler
                                    Producto p=null;//Producto creado para el po
                                    if(tipoProducto==1){//CODIGO PARA BUSQUEDA DE PELICULAS
                                        p = new Pelicula();
                                        p = p.buscaProducto(new Pelicula(), codigoProducto);

                                    }else if(tipoProducto==2){//CODIGO PARA BUSQUEDA DE VIDEOJUEGOS
                                        p = new Videojuego();
                                        p = p.buscaProducto(new Videojuego(), codigoProducto);
                                    }
                                    Date d = new Date();
                                    //3 dias para que la devolucion no tenga recargo
                                    ProductoAlquilado pa = new ProductoAlquilado(p,d,new Date(d.getTime() + 3 * Timer.ONE_DAY),null);
                                    lpa.add(pa);
                                    //lp.remove(p); No sirve de nada
                                }
                            }else if(tipoProducto==5){
                                    //CONFIRMAR Y REALIZAR ALQUILER
                                if(lpa.isEmpty()){
                                    System.out.println("Error: No ha seleccionado ningun producto");                                        
                                }else{
                                    codigoProducto=-1;
                                    opc_selec_alq=0;
                                    

                                    //En caso de que haya promociones disponibles
                                    System.out.println("Elija la promocion de la lista de promociones disponibles:");

                                    Promociones promo=null;
                                    String opcPromo="";
                                    String id_promo="";
                                    //<----------------------------------------AQUI VA EL MENU PROMOCIONES ------------------------------->
                                    do{
                                        Promociones.visualizarPromocionesActivasTodas();
                                        try{
                                            opcPromo = ObtenerTeclado.dameCadena("\nSeleccione tipo Promocion: \t1.Dia Feliz\t2.Genero\n\t\t\t\t3.Mas por menos\t4.Puntos\n\t\t\t\t5.No quiero promocion\t0.Volver Atras");
                                            id_promo = ObtenerTeclado.dameCadena("Introduzca codigo promocion(numerico): ");
                                            Integer.parseInt(id_promo);
                                        }catch(NumberFormatException nme){
                                            System.out.println("Error: ");
                                            opcPromo = "10";//Valor erroneo para repetir menu
                                        }

                                        if(opcPromo.equals("1")){
                                            promo=PromocionesDiasSemana.buscaPromocion(id_promo);//Implementar seleccion de la promocion
                                        }
                                        else if(opcPromo.equals("2")){
                                            promo=PromocionesGenero.buscaPromocion(id_promo);//Implementar seleccion de la promocion
                                        }
                                        else if(opcPromo.equals("3")){
                                            promo=PromocionesMasPorMenos.buscaPromocion(id_promo);//Implementar seleccion de la promocion
                                        }
                                        else if(opcPromo.equals("4")){
                                            promo=PromocionesPuntos.buscaPromocion(id_promo);//Implementar seleccion de la promocion
                                        }
                                        else if(opcPromo.equals("5")){
                                                            promo=null;
                                        }
                                        else if(opcPromo.equals("0")){
                                            opc_selec_alq=0;
                                        }else{
                                            System.out.println("Tipo de Promocion incorrecta");
                                        }
                                    }while(!opcPromo.equals("0") && !opcPromo.equals("1") && !opcPromo.equals("2") && 
                                            !opcPromo.equals("3") && !opcPromo.equals("4") && !opcPromo.equals("5"));

                                    double costeAlquiler = 0.00;
                                    if(promo==null){
                                        costeAlquiler = 0.00;

                                        for(ProductoAlquilado pa : lpa){//Calculo CosteAlquiler(Sin aplicar la promocion)
                                            costeAlquiler = costeAlquiler + pa.getProducto().getTarifa().getPrecio();
                                        }
                                    }else{
                                        if(promo instanceof PromocionesPuntos){
                                            int opcPuntos=0;
                                            do{
                                                opcPuntos=ObtenerTeclado.dameEntero("¿Desea usar sus puntos para el descuento?(1.Si/2.No)");
                                                if(opcPuntos==1){
                                                    ((PromocionesPuntos)promo).setAplicar(true);
                                                }else if(opcPuntos==2){
                                                    System.out.println("Sus puntos se guardaran para futuras promociones(No olvide gastarlos mientras esta promocion siga activa)");
                                                }else{
                                                    System.out.println("Error con la opcion elegida");
                                                }
                                            }while(opcPuntos!=1 && opcPuntos!=2);
                                        }
                                        costeAlquiler = promo.damePrecio(lpa,s);
                                    }
                                    //Ahora creariamos el objeto alquiler
                                    alquiler = new Alquiler(costeAlquiler,main.usuarioActual,lpa,s,promo);


                                    //CONEXION A BASE DE DATOS(PASANDO POR LA LOGICA)
                                    try{
                                        alquiler.altaAlquiler();
                                        Tarjeta t = s.getTarjetaSocio();
                                        t.setCredito(t.getCredito()-costeAlquiler);
                                        t.pagoTarjeta(s, costeAlquiler);
                                    }catch(Exception e){
                                        System.out.println("Error:"+e.getMessage());
                                    }
                                }
                            }else{
                                System.out.println("Opcion erronea.");
                            }
                            //tipoProducto>0 (Por si quieres cancelar el alquiler en el proceso)
                        }while(codigoProducto!= -1);
                    }else{
                         System.out.println("Error: No se puede crear un alquiler. Usted ya tiene un alquiler en curso.");
                    }
                    opc_selec_alq=0;
                    break;
                    //\n3.Visualiza mi alquiler"
                    //    + "\n4.Modificar Alquiler(Cambiar los productos del cliente)\n5.Anula Alquiler
                case 2: //DEVOLUCION PELICULA
                    alquiler = Alquiler.buscaAlquiler(s.getDni());
                    if(alquiler!=null){
                        System.out.println(alquiler.visualizaProductosAlquiler(alquiler.getProductosAlquilados()));
                        boolean correcto=false;
                        do{
                            String tipoP= ObtenerTeclado.dameCadena("Seleccione tipo de producto(v->Videojuego o p->Pelicula):");
                            int quitaPelicula = ObtenerTeclado.dameEntero("\nSeleccione el codigo del producto:");
                            if(tipoP.length()==1){
                                if(tipoP.charAt(0)=='v' || tipoP.charAt(0)=='p'){
                                    if(alquiler.devolucionProducto(quitaPelicula, tipoP,alquiler.getSocio().getId())){
                                        System.out.println("Producto eliminado de la lista de alquileres");
                                        if(alquiler.getProductosAlquilados().isEmpty()){
                                            System.out.println("Alquiler finalizado");
                                            opc_selec_alq=0;
                                        }
                                    }else{
                                        System.out.println("Producto no encontrado en la lista de alquileres");
                                    }
                                    correcto=true;
                                }else{
                                    System.out.println("No puede introducir caracteres diferentes de 'p' o 'v'");
                                }
                            }else{
                                System.out.println("No se puede introducir mas de un caracter");
                            }
                        }while(!correcto);
                    }
                    opc_selec_alq=0;
                    break;
                case 3: //VISUALIZAR MI ALQUILER
                    alquiler = Alquiler.buscaAlquiler(s.getDni());
                    if(alquiler!=null){
                        System.out.println(alquiler.toString());
                    }
                    opc_selec_alq=0;
                    break;
                case 4: //ANULAR ALQUILER
                    alquiler = Alquiler.buscaAlquiler(s.getDni());
                    if(alquiler!=null){
                        System.out.println(alquiler.toString());
                        if(ObtenerTeclado.dameCadena("ATENCION, esta a punto de borrar para siempre registros de la Base de Datos\nPulse 1 para confirmar y cualquier otra tecla para cancelar").equals("1")){
                            if(alquiler.anulaAlquiler())
                                System.out.println("Alquiler anulado");
                            else
                                System.out.println("Alquiler no anulado");
                        }else{
                            System.out.println("Anulacion cancelada");
                        }
                    }
                    opc_selec_alq=0;
                    break;
                case 5:
                    //VOLVER ATRAS
                    main.opc=0;
                    break;
                case 6:
                    //SALIR
                    break;
                default:
                    break;
                    
            }
            
        }while(opc_selec_alq<1 || opc_selec_alq>6);
    }
    
    public static void gestionTarjeta(int opcion){
        Socio s = (Socio)main.usuarioActual;
        if(opcion==1){
            //Consulta
            System.out.println("Usted dispone en su tarjeta de AppVideo un credito de "+s.getTarjetaSocio().getCredito()+" €");
            main.opc=0;
        }else if(opcion==2){
            //Recarga
            try{
                double valorrecarga=ObtenerTeclado.dameEntero("Introduzca el valor del recargo(sin decimales):");
                s.getTarjetaSocio().aumentaCredito(valorrecarga);
                s.getTarjetaSocio().recargaTarjeta(s,valorrecarga); 
            }catch(Exception ex){
                System.out.println("Para el valor del recargo debe introducir un valor numerico exacto");
                
            }finally{
                main.opc=0;
            }
        }
        
    }
}
